/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package supervision.report;

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import javax.el.ELContext;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.naming.NamingException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import supervision.library.Beans;
import system.general.Exc;
import system.general.Logged;
import system.general.Message;
import system.general.Persistencia;

/**
 *
 * @author emojica
 */
@ManagedBean(name = "supervision_libraryReport")
@RequestScoped
public class Library {

    Logged logged;
    private Persistencia persistencia = new Persistencia();
    private Message msg = new Message();
    private ResultSet rsts;
    private String sql;
    public String detailTable;
    public String headerTable;
    public String reportName;
    private supervision.library.Find library_Find = new supervision.library.Find();
    private List<Beans> observacionList = new ArrayList<>();
    Map map = new LinkedHashMap();

    public Library() {
        ELContext elContext = FacesContext.getCurrentInstance().getELContext();
        logged = (Logged) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "logged");

        detailTable = "reportes.supervision_biblioteca_detalle_" + String.valueOf(logged.getLoggedId());
        headerTable = "reportes.supervision_general_header_" + String.valueOf(logged.getLoggedId());
        reportName = "supervision_libreria.jasper";
    }

    public void report() throws Exc, SQLException, NamingException, Exception {
        try {
            Map params = new HashMap();
            system.general.Path path = new system.general.Path();
            //Elimina la tabla
            dropTable();
            //Crea la tabla 
            createTable();
            //inserta los datos
            loadData();
            //lee las propiedades y carga el mapa
            params.put("detailTable", detailTable);
            params.put("headerTable", headerTable);
            params.put("SUBREPORT_DIR", path.getSupervisionReportPath());
            params.put("logoPath", path.getLogoPathView());
            String jasperReport = path.getSupervisionReportPath() + reportName;
            this.persistencia.dbConnect();
            createReport(jasperReport, params, persistencia.getConn());
        } catch (JRException ex) {
        } catch (Exception ex) {
        } finally {
            this.persistencia.dbDisconnect();
        }
    }

    public Properties leerReportProperties() {
        Properties propiedades = new Properties();
        try {
            propiedades.load(getClass().getResourceAsStream("label_" + logged.getLoggedIdiom() + ".properties"));
            if (propiedades.isEmpty()) {
                return null;
            }
        } catch (Exception ex) {
            msg.showErr(namePackage(), "java", ex);
        } finally {
            return propiedades;
        }
    }

    public Properties leerProperties() {
        Properties propiedades = new Properties();
        try {
            propiedades.load(getClass().getResourceAsStream("/supervision/library/label_es.properties"));
            if (propiedades.isEmpty()) {
                return null;
            }
        } catch (Exception ex) {
            msg.showErr(namePackage(), "java", ex);
        } finally {
            return propiedades;
        }
    }

    public String obtenerValLable(String abuscar) {
        String valor = "";
        Properties properties;
        properties = leerProperties();
        //Recorremos la propiedades 
        for (Enumeration idl_pregunta1 = properties.keys(); idl_pregunta1.hasMoreElements();) {
            Object obj1 = idl_pregunta1.nextElement();
            String questionKey1 = obj1.toString();
            // buscar y comprobamos mientra recoremos  
            if (questionKey1.startsWith(abuscar)) {
                return valor = properties.getProperty(questionKey1);
            }
        }


        return valor;
    }

    private void loadData() throws Exc, SQLException, NamingException, Exception {
        try {
            int preguntaNumero, numeroSolicitud;
            String descripcion_pregunta;
            String descripcion_respuesta = null;
            String universidad_nombre;
            String universidad_sede, descripcion;
            String carrera, observacion = "";
            Date fecha_supervision = new Date();
            boolean checked;
            Map map = new LinkedHashMap();
            Properties mpran;
            sql = "SELECT ss.id AS solicitud , pg.nombre || ' ' || pg.apellido AS recepcionista, ug.nombre AS universidad_nombre, "
                    + "us.nombre AS universidad_sede, sg.carrera, sg.recibido, sg.registrado  as fecha FROM solicitud_sede ss "
                    + "LEFT JOIN solicitud_general sg ON (ss.id_solicitud = sg.id) "
                    + "LEFT JOIN universidad_sede us ON (ss.id_sede = us.id) "
                    + "LEFT JOIN persona_general pg ON (pg.id = sg.id_recepcionista) "
                    + "LEFT JOIN universidad_facultad uf ON (sg.id_facultad = uf.id) "
                    + "LEFT JOIN universidad_general ug ON (ug.id = uf.id_universidad) "
                    + "WHERE ss.id =" + logged.getMasterId();

            rsts = persistencia.executeRsts(sql);
            rsts.next();
            universidad_nombre = rsts.getString("universidad_nombre");
            universidad_sede = rsts.getString("universidad_sede");
            numeroSolicitud = rsts.getInt("solicitud");
            fecha_supervision = rsts.getDate("fecha");
            carrera = rsts.getString("carrera");
            rsts.close();

            Properties mp = leerReportProperties();

            sql = "INSERT INTO " + headerTable + " "
                    + "(etiqueta1, detalle1,"
                    + " etiqueta2, detalle2,"
                    + " etiqueta3, detalle3,"
                    + " etiqueta4, detalle4,"
                    + " etiqueta5, detalle5 ,"
                    + "etiqueta6, detalle6 )"
                    + " VALUES ("
                    + "'" + mp.getProperty("field1") + "','" + numeroSolicitud + "',"
                    + "'" + mp.getProperty("field2") + "','" + universidad_nombre + "',"
                    + "'" + mp.getProperty("field3") + "','" + universidad_sede + "',"
                    + "'" + mp.getProperty("field4") + "','" + fecha_supervision + "',"
                    + "'" + mp.getProperty("field10") + "','" + carrera + "',"
                    + "'" + mp.getProperty("title0") + "','')";
            persistencia.executeUpdate(sql);

            mp.clear();

            mp = leerProperties();
            for (Enumeration idl_pregunta = mp.keys(); idl_pregunta.hasMoreElements();) {
                Object obj = idl_pregunta.nextElement();
                String questionKey = obj.toString();
                int cant = 0;
                if (questionKey.startsWith("pregunta")) {
                    String codigo = questionKey.substring(8);
                    preguntaNumero = Integer.parseInt(codigo);
                    descripcion_pregunta = mp.getProperty(questionKey);
                    map.clear();
                    map.put("id_solicitud_sede= " + logged.getMasterId(), " AND ");
                    //map.put("idl_pregunta = " + preguntaNumero, " ");
                    map.put("idl_pregunta = " + preguntaNumero, " AND ");
                    map.put("idl_respuesta !=0 ", "  ");
                    checked = library_Find.byExist(map);
                    observacionList = library_Find.byMap(map);
                    observacion = "";
                    if (!observacionList.isEmpty()) {
                        cant = observacionList.size();
                    }
                    // if es la pregunta 14 
                    if (cant > 1) {

                        for (int c = 0; c <= cant - 1; c++) {
                            String buscar;
                            int pregunta = observacionList.get(c).getIdl_respuesta();
                            if (preguntaNumero <= 9) {
                                buscar = "respuesta0" + pregunta;
                            } else {
                                buscar = "respuesta" + pregunta;
                            }


                            descripcion_respuesta += "/n" + this.obtenerValLable(buscar);

                        }
                        sql = "INSERT INTO " + detailTable + " "
                                + "(pregunta, respuesta, descripcion_pregunta, descripcion_respuesta,observacion, checked) "
                                + "VALUES (" + preguntaNumero + ", 0,"
                                + "'" + descripcion_pregunta + " ',"
                                + "'" + descripcion_respuesta + "',"
                                + "'" + observacion + "',"
                                + checked + ")";
                        persistencia.executeUpdate(sql);
                    } else {
                        if (preguntaNumero == 14) {

                            //Verificamos si se a selecionado alguna respuesta
                            if (observacionList.isEmpty()) {
                                descripcion_respuesta = "No";
                            } else {

                                // obtnemos nuevamente las propiedades de label para  recorrer y obtner  (String)del valor seleccionado 
                                // se obtiene el valor seleccionado de la base de datos
                                int pregunta = observacionList.get(0).getIdl_respuesta();
                                //Concatemos la respuesta + el valor pregunta para asi poder saber cual  

                                String buscar = "respuesta" + pregunta;
                                //Recorremos la propiedades 
                                descripcion_respuesta = this.obtenerValLable(buscar);
                            }
                        } else {
                            if (checked) {
                                int pregunta = observacionList.get(0).getIdl_respuesta();
                                //Concatemos la respuesta + el valor pregunta para asi poder saber cual  
                                String buscar = "respuesta" + pregunta;
                                descripcion_respuesta = this.obtenerValLable(buscar);
                                if (descripcion_respuesta == "") {
                                    descripcion_respuesta = "No";
                                }


                            } else {
                                map.clear();
                                map.put("id_solicitud_sede= " + logged.getMasterId(), " AND ");
                                //map.put("idl_pregunta = " + preguntaNumero, " ");
                                map.put("idl_pregunta = " + preguntaNumero, " AND ");
                                map.put("idl_respuesta =0 ", "  ");
                                observacionList = library_Find.byMap(map);
                                if (observacionList.isEmpty()) {
                                    descripcion_respuesta = "No";
                                } else {
                                    observacion = observacionList.get(0).getObservacion();
                                    descripcion_respuesta = " ";
                                }
                            }
                        }
                        sql = "INSERT INTO " + detailTable + " "
                                + "(pregunta, respuesta, descripcion_pregunta, descripcion_respuesta,observacion, checked) "
                                + "VALUES (" + preguntaNumero + ", 0,"
                                + "'" + descripcion_pregunta + "',"
                                + "'" + descripcion_respuesta + "',"
                                + "'" + observacion + "',"
                                + checked + ")";
                        persistencia.executeUpdate(sql);

                    }


                }
            }

        } catch (Exc ex) {
            msg.showMsg(namePackage(), "system", ex.getIdError());
        } catch (SQLException ex) {
            msg.showErr(namePackage(), "sql", ex);
        } catch (Exception ex) {
            msg.showErr(namePackage(), "java", ex);
        } finally {
        }
    }

    private void dropTable() throws Exc, SQLException, NamingException, Exception {
        sql = "DROP TABLE IF EXISTS " + headerTable + "," + detailTable;
        persistencia.executeUpdate(sql);
    }

    private void createTable() throws Exc, SQLException, NamingException, Exception {
        sql = "CREATE TABLE " + detailTable
                + " (pregunta integer, "
                + "respuesta integer,"
                + "descripcion_pregunta text,"
                + "descripcion_respuesta text,"
                + "observacion text,"
                + "checked boolean) "
                + "WITH (OIDS=FALSE); "
                + "ALTER TABLE " + detailTable
                + " OWNER TO core;";

        sql += " CREATE TABLE " + headerTable
                + " (etiqueta1 text,"
                + "detalle1 text, "
                + "etiqueta2 text, "
                + "detalle2 text, "
                + "etiqueta3 text, "
                + "detalle3 text, "
                + "etiqueta4 text, "
                + "detalle4 text, "
                + "etiqueta5 text, "
                + "detalle5 text, "
                + "etiqueta6 text, "
                + "detalle6 text)"
                + "WITH (OIDS=FALSE); "
                + "ALTER TABLE " + headerTable
                + " OWNER TO core;";


        persistencia.executeUpdate(sql);





    }

    public void createReport(String archivoJasper, Map params, Connection ds) throws JRException, IOException {
        JasperPrint jasperPrint = JasperFillManager.fillReport(archivoJasper, params, ds);
        HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
        JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
    }

    private String namePackage() {
        Package pack = this.getClass().getPackage();
        return pack.getName();
    }
}
